#!/bin/bash

# 定义 GPIO 基地址
GPIO0_BASE=0x28034000
GPIO1_BASE=0x28035000
GPIO2_BASE=0x28036000
GPIO3_BASE=0x28037000
GPIO4_BASE=0x28038000
GPIO5_BASE=0x28039000

# 定义寄存器偏移量
GPIO_SWPORTA_DR=0x00
GPIO_SWPORTA_DDR=0x04
GPIO_EXT_PORTA=0x08

# 定义一个函数来读取寄存器
read_gpio_registers() {
	    local GPIO_BASE=$1
	    	
	    	AA=`echo "$1" |cut -c 7-7`
			GPIONUM=`echo "$AA-3" | bc`
			    echo "==========>>GPIO$GPIONUM<<=========="
			        echo "GPIO BASE       :$GPIO_BASE"
				    # 计算寄存器地址并以十六进制格式输出
				        local addr_DR=$((GPIO_BASE + GPIO_SWPORTA_DR))
					    local addr_DDR=$((GPIO_BASE + GPIO_SWPORTA_DDR))
					        local addr_EXT=$((GPIO_BASE + GPIO_EXT_PORTA))
						    
						    #printf "GPIO_SWPORTA_DR : 0x%x\n" "$addr_DR"
						        # 读取三个寄存器的值，并将地址转换为十六进制字符串
								echo "端口输出寄存器：0-输出低 1-输出高"
									echo -n "GPIO_SWPORTA_DR :"
									    rw -r 4 "0x$(printf '%x' "$addr_DR")" 1 | awk '{print $2}'
									    	REGVALUE=$(rw -r 4 "0x$(printf '%x' "$addr_DR")" 1 | awk '{print $2}')
											gpio_bit_show $REGVALUE $GPIONUM

											    #printf "GPIO_SWPORTA_DDR: 0x%x\n" "$addr_DDR"
											    	echo "端口方向控制寄存器：0-输入 1-输出"
													echo -n "GPIO_SWPORTA_DDR:"
													    rw -r 4 "0x$(printf '%x' "$addr_DDR")" 1 | awk '{print $2}'
													    	REGVALUE=$(rw -r 4 "0x$(printf '%x' "$addr_DDR")" 1 | awk '{print $2}')
															gpio_bit_show $REGVALUE $GPIONUM

															    #printf "GPIO_EXT_PORTA  : 0x%x\n" "$addr_EXT"
															    	echo "端口输入寄存器：0-输入低 1-输入高"
																    echo -n "GPIO_EXT_PORTA  :"
																    	rw -r 4 "0x$(printf '%x' "$addr_EXT")" 1 | awk '{print $2}'  
																		REGVALUE=$(rw -r 4 "0x$(printf '%x' "$addr_EXT")" 1 | awk '{print $2}')
																			gpio_bit_show $REGVALUE $GPIONUM
																			    echo ""
																		    }
																		    gpio_bit_show() {
																			    	# 转换为二进制
																					binary=$(echo "obase=2; ibase=16; $1" | bc)
																						# 确保二进制数是 16 位
																							binary=$(printf "%016d" "$binary")
																								# 输出每一位的值
																									for i in $(seq 0 15); do
																											    bit=${binary:i:1}
																											    	    echo "GPIO$2_$i : $bit"
																												    	done
																												}

																												# 读取每个 GPIO 的寄存器
																												read_gpio_registers $GPIO0_BASE
																												read_gpio_registers $GPIO1_BASE
																												read_gpio_registers $GPIO2_BASE
																												read_gpio_registers $GPIO3_BASE
																												read_gpio_registers $GPIO4_BASE
																												read_gpio_registers $GPIO5_BASE

